import re

import ddddocr
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait  # 这个是为显隐式等待提供方法的模块
from selenium.webdriver.support import expected_conditions as EC  # 这个是为显示等待提供定位功能的模块

"""
实际开发中可能的情况
设：
异步登录请求
请求地址：https://www.xunter.com/login
请求参数：
    username:xunter
    password:xunter
    captcha:w23d
请求方式：
    post
图片img标签src：https://www.xunter.com/captcha/25145782346
    
"""

options = webdriver.ChromeOptions()  # 创建谷歌浏览器的options对象来接收浏览器的相关设置

options.add_argument('--start-maximized')  # 最大化窗口
options.add_argument('--incognito')  # 无痕浏览
options.add_argument('--disable-extensions')  # 禁用浏览器的扩展程序,避免干扰网站的打开
options.add_experimental_option("detach", True)  # 禁止浏览器自动关闭
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)

# options.add_argument('--headless')
# options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"',)
# options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options)  # 创建谷歌浏览器驱动对象
ocr = ddddocr.DdddOcr(show_ad=False, beta=True)  #初始化模型对象  beta=True为使用第二套模型


driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    'source': '''
    Object.defineProperty(navigator, 'webdriver',{get:() => false})
    '''
})

driver.get('https://captcha8.scrape.center/')

wait = WebDriverWait(driver, 6)  # 设置等待时间


# titles = driver.find_elements(By.CLASS_NAME,'m-b-sm')   #找单个
username_inp, password_inp, captach_inp = wait.until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, 'el-input__inner'))
)

username_inp.send_keys('admin')
password_inp.send_keys('admin')

"""
接下来就是处理验证码
1、使用selenium对canvas画布进行截图处理得到数据
2、直接使用js代码得到canvas画布的base64编码数据
//document.getElementById('captcha').toDataURL('image/png')
"""

while True:
    # 1、使用selenium对canvas画布进行截图处理得到数据
    captcha = wait.until(EC.presence_of_element_located((By.ID, 'captcha')))    #找到验证码图像位置
    captcha_data = captcha.screenshot_as_base64        #只需要得到图片的base64编码数据进行图像识别就用这个
    # captcha.screenshot('captcha.jpg')   #保存到本地就用这个

    # 交给ocr进行识别
    res = ocr.classification(captcha_data)
    captach_inp.send_keys(res)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.el-button.login.el-button--primary'))).click()
    is_success = re.findall(r'登陆成功',driver.page_source) #成功准则  能找到登陆成功
    # 成功就结束识别就循环
    if is_success:
        print(is_success)
        break
    else:
        print('登陆失败')
        captach_inp.clear()
        captcha.click()

input()
driver.quit()
